#pragma once

#include "Comm.hpp"
#include "EventLoop.hpp"


class LoopThread
{
private:
    // 实例化 EventLoop 对象，唤醒 _cond 上有可能阻塞的线程，开始运行 EventLoop 模块的功能 
    void ThreadEntry()
    {
        LOG(INFO, "ThreadEntry!\n");
        EventLoop loop;
        {
            std::unique_lock<std::mutex> _lock(_mutex);
            _loop = &loop;
            _cond.notify_all();
        }
        loop.Start();
    }

public:
    // 创建线程，设定线程入口函数 
    LoopThread() : _loop(nullptr), _thread(std::thread(&LoopThread::ThreadEntry, this)) {}

    // 返回当前线程关联的对象指针 
    EventLoop* GetLoop()
    {
        EventLoop* loop = nullptr;
        {
            std::unique_lock<std::mutex> _lock(_mutex);  // 加锁 
            _cond.wait(_lock, [&](){ return _loop != nullptr; });  // _loop 为空就一直阻塞，等待被唤醒 
            loop = _loop;
        }
        return loop;
    }

private:
    EventLoop* _loop;                  // EventLoop 指针变量，需要在线程内实例化 
    std::thread _thread;               // EventLoop 对应的线程 

    // 同于实现 loop 获取的同步关系，避免在线程创建后，_loop 还没有实例化之前获取 _loop 
    std::mutex _mutex;                 // 互斥锁 
    std::condition_variable _cond;     // 条件变量 
};